package cz.pecinovsky.česky.oopnz._125_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

//import cz.pecinovsky.česky.oopnz.správce.IPosuvný;
import cz.pecinovsky.česky.oopnz.správce.Kreslítko;
import cz.pecinovsky.česky.oopnz.správce.Obdélník;
import cz.pecinovsky.česky.oopnz.správce.Trojúhelník;


import static cz.pecinovsky.česky.oopnz._125_.IModulový_129_133.IModulový;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%I+ =133c
//
//import správce.*;
//%I-
//%I+ >=133z
//
//import cz.pecinovsky.česky.oopnz.správceplátna.IPosuvný;
//import cz.pecinovsky.česky.oopnz.správceplátna.Kreslítko;
//import cz.pecinovsky.česky.oopnz.správceplátna.Obdélník;
//import cz.pecinovsky.česky.oopnz.správceplátna.Trojúhelník;
//%I-
//%A+ >=133z

import cz.pecinovsky.česky.oopnz.utility.Barva;
import cz.pecinovsky.česky.oopnz.utility.Pozice;
import cz.pecinovsky.česky.oopnz.utility.Směr8;
//%A-
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   _116_Šipka_119
 * Následující: Prozatím není
 *
 * Projekt  020z - Komentáře
 *   + Začlenění do standardní šablony + Komentáře
 *
 * Projekt  021z - Použití this
 *   ~ V prvních dvou konstruktorech nahrazena původní těla
 *     příkazem this volajícím obecnější konstruktor
 *
 * Projekt  022z - Přetěžování
 *   + Přidány další dva konstruktory
 *   ~ Ve třetím konstruktoru nahrazeno tělo příkazem this
 *     volající přidaný obecnější konstruktor
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Šipka_125_133
{    private Šipka_125_133() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Instance třídy {@code Šipka} představují šipky natočené na východ.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
//%I+ <129
//public class Šipka implements IPosuvný
//%I-
//%X+ <129
public class Šipka implements IModulový
//%X-
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//%X+ <128

    private static final int IMPLICITNÍ_X = 0;

    private static final int IMPLICITNÍ_Y = 0;

    private static final Barva IMPLICITNÍ_BARVA = Barva.ČERNÁ;

    private static final int IMPLICITNÍ_MODUL = 50;



//%X-
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//%X+ <128

     /** Počet doposud vytvořených instancí. */
     private static int počet = 0;



//%X-
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//%I+ <128
//
//    /** Obdélníková část představující tělo šipky. */
//    private Obdélník tělo;
//
//    /** Trojúhelníkové zakončení šipky. */
//    private Trojúhelník hlava;
//
//    /** Barva celé šipky, tj. těla i hlavy. */
//    private Barva barva;
//%I-
//%X+ <128

    /** Pořadové (identifikační) číslo dané instance. */
    private final int ID;

    /** Obdélníková část představující tělo šipky. */
    private final Obdélník tělo;

    /** Trojúhelníkové zakončení šipky. */
    private final Trojúhelník hlava;

    /** Barva celé šipky, tj. těla i hlavy. */
    private final Barva barva;
//%X-



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů a barvy
     * umístěnou v levém horním rohu plátna.
     */
    public Šipka()
    {
//%I+ <128
//        this(0, 0);
//%I-
//%X+ <128
        this(IMPLICITNÍ_X, IMPLICITNÍ_Y);
//%X-
    }


    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů a barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     */
    public Šipka(int x, int y)
    {
//%I+ <128
//        this(x, y, Barva.ČERNÁ);
//%I-
//%X+ <128
        this(x, y, IMPLICITNÍ_BARVA);
//%X-
    }


    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů zadané barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     * @param barva  Počáteční barva vytvářené šipky
     */
    public Šipka(int x, int y, Barva barva)
    {
//%I+ <128
//        this(x, y, 50, barva);
//%I-
//%X+ <128
        this(x, y, IMPLICITNÍ_MODUL, barva);
//%X-
    }


    /***************************************************************************
     * Vytvoří šipku zadaných rozměrů a implicitní barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     * @param modul Průměr vytvárené šipky
     */
    public Šipka(int x, int y, int modul)
    {
//%I+ <128
//        this(x, y, modul, Barva.ČERNÁ);
//%I-
//%X+ <128
        this(x, y, modul, IMPLICITNÍ_BARVA);
//%X-
    }


    /***************************************************************************
     * Vytvoří šipku zadaných rozměrů a implicitní barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     * @param modul Průměr vytvárené šipky
     * @param barva  Barva šipky
     */
    public Šipka(int x, int y, int modul, Barva barva)
    {
//%X+ <128
        počet   = počet + 1;
        this.ID = počet;

//%X-
        int m2 = modul / 2;
        int m3 = modul / 3;

        this.tělo  = new Obdélník   (x,    y+m3, m2, m3,   barva);
        this.hlava = new Trojúhelník(x+m2, y,    m2, modul,barva, Směr8.VÝCHOD);
        this.barva   = barva;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Nastaví novou barvu šipky; nadále si však pamatuje její výchozí barvu.
     *
     * @param nová Zadávaná nová barva
     */
    public void setBarva(Barva nová)
    {
        tělo .setBarva(nová);
        hlava.setBarva(nová);
    }


    // Sada přístupových metod vlastnosti: Pozice ******************************

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    public int getX()
    {
        return tělo.getX();
    }


    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    public int getY()
    {
        return hlava.getY();
    }


    /***************************************************************************
     * Vrátí přepravku se svojí aktuální pozicí.
     *
     * @return Aktuální pozice šipky
     */
    @Override
    public Pozice getPozice()
    {
        return new Pozice(getX(), getY());
    }


    /***************************************************************************
     * Nastaví novou pozici šipky.
     *
     * @param p Nastavovaná pozice
     */
    @Override
    public void setPozice(Pozice p)
    {
        this.setPozice(p.x, p.y);
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    @Override
    public void setPozice(int x, int y)
    {
        int m  = hlava.getVýška();
        int m2 = m / 2;
        int m3 = m / 3;

        tělo .setPozice(x,    y+m3);
        hlava.setPozice(x+m2, y);
    }


    // Sada přístupových metod vlastnosti: Rozměr / Modul **********************

    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu -
     * pro šipku je to její délka, které je současně šířkou základny hlavy.
     *
     * @return Délka a šířka šipky
     */
//%X+ <129
    @Override
//%X-
    public int getModul()
    {
        return hlava.getVýška();
    }


    /***************************************************************************
     * Nastaví nový modul = "čtvercový" rozměr instance;
     * na zadaný rozměr se nastaví její výška i šířka.
     *
     * @param modul  Nově nastavovaný rozměr v obou směrech; rozměr>0
     */
//%X+ <129
    @Override
//%X-
    public void setModul(int modul)
    {
        int x  = tělo.getX();
        int y  = hlava.getY();
        int m  = modul;
        int m2 = m / 2;
        int m3 = m / 3;

        tělo .setPozice(x,    y+m3);
        hlava.setPozice(x+m2, y);

        tělo .setRozměr(m2, m3);
        hlava.setRozměr(m2, m);
    }

//%X+ <126

    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
//%X-
//%I+ >126 <128
//        return "Šipka(x=" + getX() + ", y=" + getY() +
//               ", modul" + getModul() + ", barva=" + barva + ")";
//%I-
//%X+ <128
        return "Šipka_" + ID + "(" + getPozice() + ", modul=" + getModul() +
               ", barva=" + barva + ")";
//%X-
//%X+ <126
    }

//%X-


//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        tělo .nakresli(kreslítko);
        hlava.nakresli(kreslítko);
    }


    /***************************************************************************
     * Zprůsvitní šipku, tj. nastaví jí průsvitnější barvu.
     */
    public void průsvitná()
    {
        tělo .setBarva(barva.průsvitná());
        hlava.setBarva(barva.průsvitná());
    }


    /***************************************************************************
     * Vrátí šipce její výchozí barvu.
     */
    public void vraťBarva()
    {
        setBarva(barva);
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Šipka inst = new Šipka();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//%== //Takto se označí řádek, jenž bude odkomentován (vhodné např. pro importy)
//Je-li na 6 pozici mezera, odmaže se také
//%X+ <xxx
//%X-
//%I+ <xxx
//%I-

//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
